#测试函数多次请求同一个fixtures，fixtures返回值被缓存

import pytest


# Arrange
@pytest.fixture
def first_entry():
    return "a"


# Arrange
@pytest.fixture
def order():
    return []


# Act
@pytest.fixture
def append_first(order, first_entry):
    # 在这里order第一次被请求，返回一个列表[]
    # 接着，order空列表增加了first_entry的返回值，此时的order变成了["a"]，被缓存起来
    return order.append(first_entry) #["a"]



'''
在同一个测试函数中，fixture也可以被请求多次。但是在这个测试函数中，pytest在第一次执行fixture函数之后，不会再次执行它们。
如果第一次执行fixture函数有返回值，那么返回值会被缓存起来。
'''

#1. 在fixture函数append_first中，order第一次被请求，返回一个列表[]，被缓存起来。
#2. 接着order.append(first_entry)在[]中增加了first_entry的返回值，所以，此时的order变成了["a"]，被缓存起来。
#3. 最后，在测试函数test_string_only中，order第二次被请求，但是并不会拿到空列表[]，而且拿到了被缓存起来的["a"]。

def test_string_only(append_first, order, first_entry):
    assert order == [first_entry]